package cn.cnic.security.nssap.stearm.etl.dao;

import java.io.IOException;
import java.io.InputStream;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.util.Properties;

/**
 * database
 * Created by xiaojianping
 * Data:2021/6/15
 * Time:17:01
 */
public class DBUtils {
    public Connection conn;
    public PreparedStatement pstmt;
    public ResultSet rs;
    public int row=0;

    public static String url;
    public static String name;
    public static String pwd;
    public static String className;

    static{
        try {
            Properties p = new Properties();
            //获取配置文件
            InputStream is = DBUtils.class.getClassLoader().getResourceAsStream("jdbc.properties");
            p.load(is);

            //获取配置文件中的值
            url = p.getProperty("jdbc.url");
            name = p.getProperty("jdbc.username");
            pwd = p.getProperty("jdbc.password");
            className = p.getProperty("jdbc.driver");

        } catch (IOException e) {
            e.printStackTrace();
        }
    }

    //与数据库建立连接的方法，返回一个Connection对象
    public Connection lianJie(){

        try{
            Class.forName(className);//加载驱动(前提是要有jar包,否则会报类找不到异常)
            conn = DriverManager.getConnection(url,name,pwd);//建立与数据库的连接
            return conn;
        }catch(Exception e){
            e.printStackTrace();
        }
        return null;
    }

    //与数据库断开连接的方法
    public void duanKai(Connection conn,PreparedStatement pstmt,ResultSet rs){
        //后打开的先关闭
        try {
            if(rs!=null){
                rs.close();
            }
            if(pstmt!=null){
                pstmt.close();
            }
            if(conn!=null){
                conn.close();
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

    //查询方法
    //定义通用的查询方法 需要传递两个参数(一个是String类型sql语句，一个是保存sql中的？参数的Object类型的数组)
    public ResultSet getQuery(String sql,Object[] o) throws Exception{

        conn = this.lianJie();
        pstmt = conn.prepareStatement(sql);//使用预状态通道防止SQL注入
        for(int i=0; i<o.length; i++){
            pstmt.setObject(i+1, o[i]);
        }
        rs = pstmt.executeQuery();
        return rs;
    }

    //增删改方法
    public int getzsg(String sql,Object[] o) throws Exception{

        conn = this.lianJie();
        pstmt = conn.prepareStatement(sql);
        for(int i=0; i<o.length; i++){
            pstmt.setObject(i+1, o[i]);
        }
        row = pstmt.executeUpdate();
        return row;
    }

}
